﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCHSHue.DAL;

namespace TCHSHue.BLL
{

    public class GridBaiViet
    {
        public Guid MaBaiViet { get; set; }
        public string ChuDe { get; set; }
        public string NoiDungTomTat { get; set; }
        public string HoTen { get; set; }
        public string TenChuyenMuc { get; set; }
        public DateTime NgayViet { get; set; }
        public string TinhTrang { get; set; }
        public string AnhDaiDienURL { get; set; }
        public int MaTheLoai { get; set; }
        public string URL { get; set; }
    }
    public class BaiVietBLL
    {
        /// <summary>
        /// Lấy danh sách các bài viết theo từ khóa
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        internal static List<GridBaiViet> getListTheoTuKhoa(string key, int pSize, int currentPage)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ls = (from e in data.BaiViets
                          where (e.chuDe.Contains(key) || e.noiDungTomTat.Contains(key) || e.noiDung.Contains(key)) && e.tinhTrang == (int)TinhTrangBaiViet.DaDuyet
                          orderby e.ngayViet ascending
                          select new GridBaiViet { URL = getURL(e.maTheLoai.Value), MaTheLoai = e.maTheLoai.Value, AnhDaiDienURL = string.IsNullOrEmpty(e.anhDaiDienUrl) ? (e.maTheLoai.Value == Hang.TINTUC ? "news.jpg" : "notice.jpg") : e.anhDaiDienUrl, NoiDungTomTat = HttpUtility.HtmlDecode(e.noiDungTomTat), ChuDe = HttpUtility.HtmlDecode(e.chuDe), HoTen = e.User.hoTen, MaBaiViet = e.maBaiViet, NgayViet = e.ngayViet.Value, TenChuyenMuc = e.TheLoai.tenTheLoai, TinhTrang = (e.tinhTrang.Value == (int)TinhTrangBaiViet.ChuaDuyet ? "Chưa duyệt" : "Đã duyệt") }).Skip((currentPage - 1) * pSize).Take(pSize);
                return ls.ToList();
            }
        }

        /// <summary>
        /// Lấy tổng số bài viết theo từ khóa
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        internal static int getListTheoTuKhoaToTal(string key)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ts = (from e in data.BaiViets
                          where (e.chuDe.Contains(key) || e.noiDungTomTat.Contains(key) || e.noiDung.Contains(key)) && e.tinhTrang == (int)TinhTrangBaiViet.DaDuyet
                          select e).Count();
                return ts;
            }
        }

        /// <summary>
        /// Tạo URL cho các bài viết trong tìm kiếm
        /// </summary>
        /// <param name="idTheLoai"></param>
        /// <returns></returns>
        public static string getURL(int idTheLoai)
        {
            return "";
        }

        /// <summary>
        /// Lấy tất cả các bài viết không kể thể loại và tình trạng
        /// </summary>
        /// <param name="pSize"></param>
        /// <param name="currentPage"></param>
        /// <returns></returns>
        internal static List<GridBaiViet> getListTheoTrang(int pSize, int currentPage)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ls = (from e in data.BaiViets
                          orderby e.ngayViet ascending
                          select new GridBaiViet { ChuDe = HttpUtility.HtmlDecode(e.chuDe), HoTen = e.User.hoTen, MaBaiViet = e.maBaiViet, NgayViet = e.ngayViet.Value, TenChuyenMuc = e.TheLoai.tenTheLoai, TinhTrang = (e.tinhTrang.Value == (int)TinhTrangBaiViet.ChuaDuyet ? "Chưa duyệt" : "Đã duyệt") }).Skip((currentPage - 1) * pSize).Take(pSize);
                return ls.ToList();
            }
        }

        /// <summary>
        /// Lấy tổng số của tất cả các bài viết
        /// </summary>
        /// <returns></returns>
        internal static int getToTal()
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ts = (from e in data.BaiViets
                          select e).Count();
                return ts;
            }
        }

        /// <summary>
        /// Lấy danh sách các bài viết theo thể loại có phân trang và tình trạng của bài viết
        /// </summary>
        /// <param name="theLoai"></param>
        /// <param name="pSize"></param>
        /// <param name="currentPage"></param>
        /// <returns></returns>
        internal static List<GridBaiViet> getListTheoTrang(int theLoai, int pSize, int currentPage, int tinhTrang)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ls = (from e in data.BaiViets
                          where e.maTheLoai == theLoai && e.tinhTrang == tinhTrang
                          orderby e.ngayViet descending
                          select new GridBaiViet { MaTheLoai = e.maTheLoai.Value, AnhDaiDienURL = string.IsNullOrEmpty(e.anhDaiDienUrl) ? (e.maTheLoai.Value == Hang.TINTUC ? "news.jpg" : "notice.jpg") : e.anhDaiDienUrl, NoiDungTomTat = HttpUtility.HtmlDecode(e.noiDungTomTat), ChuDe = HttpUtility.HtmlDecode(e.chuDe), HoTen = e.User.hoTen, MaBaiViet = e.maBaiViet, NgayViet = e.ngayViet.Value, TenChuyenMuc = e.TheLoai.tenTheLoai, TinhTrang = (e.tinhTrang.Value == (int)TinhTrangBaiViet.ChuaDuyet ? "Chưa duyệt" : "Đã duyệt") }).Skip((currentPage - 1) * pSize).Take(pSize);
                return ls.ToList();
            }
        }

        /// <summary>
        /// Lấy tổng số bài viết theo thể loại và tình trạng
        /// </summary>
        /// <param name="theLoai"></param>
        /// <param name="tinhTrang"></param>
        /// <returns></returns>
        internal static int getToTal(int theLoai, int tinhTrang)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ts = (from e in data.BaiViets
                          where e.maTheLoai == theLoai && e.tinhTrang == tinhTrang
                          select e).Count();
                return ts;
            }
        }

        /// <summary>
        /// Lấy danh sách các bài viết theo thể loại có phân trang, không quan tâm đến tình trạng bài viết
        /// </summary>
        /// <param name="theLoai"></param>
        /// <param name="pSize"></param>
        /// <param name="currentPage"></param>
        /// <returns></returns>
        internal static List<GridBaiViet> getListTheoTrang(int theLoai, int pSize, int currentPage)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ls = (from e in data.BaiViets
                          where e.maTheLoai == theLoai
                          orderby e.ngayViet descending
                          select new GridBaiViet { MaTheLoai = e.maTheLoai.Value, AnhDaiDienURL = string.IsNullOrEmpty(e.anhDaiDienUrl) ? (e.maTheLoai.Value == Hang.TINTUC ? "news.jpg" : "notice.jpg") : e.anhDaiDienUrl, NoiDungTomTat = HttpUtility.HtmlDecode(e.noiDungTomTat), ChuDe = HttpUtility.HtmlDecode(e.chuDe), HoTen = e.User.hoTen, MaBaiViet = e.maBaiViet, NgayViet = e.ngayViet.Value, TenChuyenMuc = e.TheLoai.tenTheLoai, TinhTrang = (e.tinhTrang.Value == (int)TinhTrangBaiViet.ChuaDuyet ? "Chưa duyệt" : "Đã duyệt") }).Skip((currentPage - 1) * pSize).Take(pSize);
                return ls.ToList();
            }
        }

        /// <summary>
        /// Lấy tổng số bài viết theo thể loại
        /// </summary>
        /// <param name="theLoai"></param>
        /// <param name="tinhTrang"></param>
        /// <returns></returns>
        internal static int getToTal(int theLoai)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ts = (from e in data.BaiViets
                          where e.maTheLoai == theLoai
                          select e).Count();
                return ts;
            }
        }

        /// <summary>
        /// Lấy danh sách các bài viết theo tình trạng, không quan tâm đến thể loại
        /// </summary>
        /// <param name="theLoai"></param>
        /// <param name="pSize"></param>
        /// <param name="currentPage"></param>
        /// <returns></returns>
        internal static List<GridBaiViet> getListTheoTrang(string temp, int tinhTrang, int pSize, int currentPage)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ls = (from e in data.BaiViets
                          where e.tinhTrang == tinhTrang
                          orderby e.ngayViet descending
                          select new GridBaiViet { MaTheLoai = e.maTheLoai.Value, AnhDaiDienURL = string.IsNullOrEmpty(e.anhDaiDienUrl) ? (e.maTheLoai.Value == Hang.TINTUC ? "news.jpg" : "notice.jpg") : e.anhDaiDienUrl, NoiDungTomTat = HttpUtility.HtmlDecode(e.noiDungTomTat), ChuDe = HttpUtility.HtmlDecode(e.chuDe), HoTen = e.User.hoTen, MaBaiViet = e.maBaiViet, NgayViet = e.ngayViet.Value, TenChuyenMuc = e.TheLoai.tenTheLoai, TinhTrang = (e.tinhTrang.Value == (int)TinhTrangBaiViet.ChuaDuyet ? "Chưa duyệt" : "Đã duyệt") }).Skip((currentPage - 1) * pSize).Take(pSize);
                return ls.ToList();
            }
        }

        /// <summary>
        /// Lấy tổng số bài viết tình trạng
        /// </summary>
        /// <param name="theLoai"></param>
        /// <param name="tinhTrang"></param>
        /// <returns></returns>
        internal static int getToTal(string temp, int tinhTrang)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var ts = (from e in data.BaiViets
                          where e.tinhTrang == tinhTrang
                          select e).Count();
                return ts;
            }
        }

        /// <summary>
        /// Tạo bài viết
        /// </summary>
        /// <param name="bv"></param>
        /// <returns></returns>
        internal static bool create(BaiViet bv)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                try
                {
                    bv.chuDe = bv.chuDe.Truncated(255);
                    if (bv.maTheLoai == Hang.COCAUTOCHUC || bv.maTheLoai == Hang.CHUCNANGNHIEMVU)
                    {
                        var ls = (from e in data.BaiViets
                                  where e.maTheLoai == bv.maTheLoai
                                  select e).ToList();
                        if (ls == null || ls.Count == 0)
                        {
                            data.BaiViets.InsertOnSubmit(bv);
                            data.SubmitChanges();
                            return true;
                        }
                        else
                            return false;
                    }
                    else
                    {
                        data.BaiViets.InsertOnSubmit(bv);
                        data.SubmitChanges();
                        return true;
                    }
                }
                catch
                {
                    return false;
                }
            }
        }

        internal static bool delete(string maBaiViet)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var maBV = new Guid(maBaiViet);
                var bv = (from e in data.BaiViets
                          where e.maBaiViet == maBV
                          select e).SingleOrDefault();
                if (bv != null)
                {
                    if (bv.maTheLoai == Hang.COCAUTOCHUC || bv.maTheLoai == Hang.CHUCNANGNHIEMVU)
                        return false;
                    data.BaiViets.DeleteOnSubmit(bv);
                    data.SubmitChanges();
                    return true;
                }
                return false;
            }
        }

        internal static BaiViet getBaiViet(string idBaiViet)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var maBV = new Guid(idBaiViet);
                var bv = (from e in data.BaiViets
                          where e.maBaiViet == maBV
                          select e).SingleOrDefault();
                return bv;
            }
        }

        internal static bool update(BaiViet baiViet)
        {
            using (QLHSHueDataContext data = new QLHSHueDataContext())
            {
                var bv = (from e in data.BaiViets
                          where e.maBaiViet == baiViet.maBaiViet
                          select e).SingleOrDefault();
                if (bv != null)
                {
                    bv.chuDe = baiViet.chuDe.Truncated(255);
                    bv.maTheLoai = baiViet.maTheLoai;
                    bv.maUser = baiViet.maUser;
                    bv.noiDungTomTat = baiViet.noiDungTomTat;
                    bv.noiDung = baiViet.noiDung;
                    bv.tinhTrang = baiViet.tinhTrang;
                    bv.anhDaiDienUrl = baiViet.anhDaiDienUrl;
                    data.SubmitChanges();
                    return true;
                }
                else
                    return false;
            }
        }
    }
    public enum TinhTrangBaiViet
    {
        ChuaDuyet, DaDuyet
    }
}